package wodegua.d29_多线程;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 前两种线程创建方式都存在的一个问题
 * 假如线程执行完毕后有一些数据需要返回，他们重写的run方法均不能直接返回结果。
 *
 * 怎么解决这个问题?
 * ●JDK 5.0提供了Callable接口和FutureTask类来实现(多线程的第三种创建方式)。
 * 这种方式最大的优点:可以返回线程执行完毕后的结果，
 *
 * 多线程的第三种创建方式:利用Callable接口、FutureTask类来实现.
 * 1.创建任务对象
 * 1.1.定义一个类实现Callable接口，重写call方法，封装要做的事情，和要返回的数据
 * 1.2.把Callable类型的对象封装成FutureTask(线程任务对象)
 * 2.把线程任务对象交给Thread对象。
 * 3.调用Thread对象的start方法启动线程，
 * 4.线程执行完毕后、通过FutureTask对象的的get方法去获取线程任务执行的结果。
 *
 * FutureTask的API
 * FutureTask提供的构造器
 * public FutureTask<>(Callable ca11)   把Callable对象封装成FutureTask对象。
 *
 * FutureTask提供的方法
 * public V get()throws Exception        获取线程执行ca11方法返回的结果。
 *
 * 线程创建方式三的优缺点
 * 优点:线程任务类只是实现接口，可以继续继承类和实现接口，扩展性强;可以在线程执行完毕后去获取线程执行的结果。
 * 缺点:编码复杂一点。
 */
public class d1_threadTest3 {
    public static void main(String[] args) throws Exception {
// 3、创建一个Callable的对象
        Callable<String> c = new MyCallable(100);

        FutureTask<String> f1 = new FutureTask<>(c);
        new Thread(f1).start();

        System.out.println(f1.get());
    }
}
